package base

import (
	"encoding/json"
	"strconv"
	"time"

	"game-server/conf"
	"game-server/log"
	"github.com/astaxie/beego/cache"
	_ "github.com/astaxie/beego/cache/redis"
	"github.com/name5566/leaf/gate"
)

var storage cache.Cache

var InitConn map[int32]gate.Agent

var RoomList []int32

var RoomOver []int32

var PokerList []int32

var PokerOver []int32

var ExitRoom []int32

var RoomTotal []int32

var RoomPool []int32

var UserList []int32

var Items []int32

// 房间属性
type Pk struct {
	RoomNo        int32         `json:"roomNo"`        // 房间号
	Person        int32         `json:"person"`        // 房间人数
	RoundId       int32         `json:"roundId"`       // 当前局数
	Round         int32         `json:"round"`         // 总局数
	Players       []*PlayerInfo `json:"players"`       // 玩家
	ExitNo        int32         `json:"exitNo"`        // 退出人数
	Status        int32         `json:"status"`        // 房间状态
	Destroy       bool          `json:"destroy"`       // 是否清除数据
	PassWord      int32         `json:"passWord"`      // 密碼
	OpenTime      int64         `json:"openTime"`      // 开房时间
	EggOwnerId    int32         `json:"eggOwnerId"`    // 蛋拥有者
	RewardType    int32         `json:"rewardType"`    // 奖励类型
	Value         int32         `json:"value"`         // 奖励值
	GetEggTime    int64         `json:"getEggTime"`    // 接到蛋的时间
	BoomTime      int64         `json:"boomTime"`      // 蛋爆炸的时间
	OpTime        int64         `json:"opTime"`        // 传蛋的时间
	StartGameTime int64         `json:"startGameTime"` // 开始时间
	RoomOwner     int32         `json:"roomOwner"` 		// 房主
	AnswerTime    int64        `json:"answerTime"` 		// 开始答题时间
}

// 玩家属性
type PlayerInfo struct {
	PlayerId int32   `json:"playerId"` // 玩家ID
	NickName string  `json:"nickName"` // 玩家ID
	IconUrl  string  `json:"iconUrl"`  // 玩家ID
	Overtime int64   `json:"overtime"` // 最后结束时间
	OpTime   int64   `json:"opTime"`   // 托管上次操作时间
	UsedItem   int32 `json:"usedItem"` // 身上的道具ID
	OpenId   string  `json:"openId"` // openId
	RoomNo   int32   `json:"RoomNo"` // RoomNo
	Gold     int32   `json:"Gold"`   // 金幣
	Score    int32   `json:"Score"`  // 積分
	PlayTime int64   `json:"playTime"`
	Online   bool    `json:"bool Online"`
	ItemId   []int32 `json:"int32 itemId"`
	NameNum   int32 `json:"int32 nameNum"` // 名字修改次数
	BirdNum   int32 `json:"int32 birdNum"` // 鸟修改次数
	BirdID   int32 `json:"int32 birdID"` // 鸟ID
	AllRank   int32 `json:"int32 allRank"` // 鸟ID

}

type Player struct {
	GameUserId int32 `json:"gameUserId"`
	GoodCard   int32 `json:"goodCard"`
}

// 道具信息
type ItemInfo struct {
	UserID int32 `json:"userID"`  //拥有者id
	TargetID   int32 `json:"targetID"` // 被使用者id
	ItemID   int32 `json:"itemID"`   // 物品id
	Status   int32 `json:"status"`  // 物品使用状态
}



func init() {
	var c cache.Cache
	var err error
	if conf.Server.Cache == "redis" {
		c, err = cache.NewCache("redis", `{"key":"yaba","conn":"`+conf.Server.Redis+`","dbNum":"`+conf.Server.RedisDb+`"}`)
	} else {
		c, err = cache.NewCache("memory", `{}`)
	}
	if err != nil {
		log.Debug("Data: new error = ", err)
	} else {
		storage = c
	}

	InitConn = make(map[int32]gate.Agent)
}

func IsExist(prefix string, key int32) bool {
	return storage.IsExist(Datakey(prefix, key))
}

func Get(prefix string, key int32) interface{} {
	k := Datakey(prefix, key)
	if storage.IsExist(k) {
		r := storage.Get(k)
		if r != nil {
			if conf.Server.Cache == "redis" {
				ba := []byte{}
				for _, b := range r.([]uint8) {
					ba = append(ba, byte(b))
				}
				if prefix == "user" {
					var data PlayerInfo

					err := json.Unmarshal([]byte(string(ba)), &data)
					if err != nil {
						log.Error(" data err = ", err)
					}

					return data
				}

				if prefix == "room" {
					var data Pk

					err := json.Unmarshal([]byte(string(ba)), &data)
					if err != nil {
						log.Error(" data err = ", err)
					}

					return data
				}
				if prefix == "item" {
					var data ItemInfo

					err := json.Unmarshal([]byte(string(ba)), &data)
					if err != nil {
						log.Error(" data err = ", err)
					}

					return data
				} else {
					var data []int32
					err := json.Unmarshal([]byte(string(ba)), &data)
					if err != nil {
						log.Error(" data err = ", err)
					}

					return data
				}
			} else {
				return storage.Get(k)
			}
		}
	}
	return nil
}

func Put(inc string, key int32, value interface{}) {
	if conf.Server.Cache == "redis" {
		v, _ := json.Marshal(value)
		err := storage.Put(Datakey(inc, key), v, 86400*time.Second)
		if err != nil {
			log.Debug("redis err = ", err)
		}
	} else {
		err := storage.Put(Datakey(inc, key), value, 86400*time.Second)
		if err != nil {
			log.Debug("err = ", err)
		}
	}
}

func Delete(dec string, key int32) {
	storage.Delete(Datakey(dec, key))
	storage.Decr(dec + "Num")
}

func Datakey(prefix string, key int32) string {
	return prefix + strconv.FormatInt(int64(key), 10)
}

func Incr(inc string) {
	storage.Incr(inc + "Num")
}
